■ オルタネートスイッチによるLEDの点灯、消灯         

    最初の入力検出としてはオルタネートスイッチを使った回路がよいと思います。オルタネートスイッチでLEDを点灯、
  消灯させる回路を以下に示します。
  モーメンタリースイッチを使ってLEDを確実に点灯、消灯させるのはチャタリングがあるので結構難しいものになります。
    
     PICの入力ポートの入力検出方法の習得   <CCS編>  <C18編>  <C30 dsPIC編>  <C30 PIC24編> <HI-TECH編

     
  <試作品仕様>
   ・ 電源(+5V)を入れたあと、オルタネートスイッチをONすると、LEDが点灯すること
     逆にOFFするとLEDが消灯すること
  


 (1) CCS編

    CCSコンパイラの場合の例を以下に示します。

  <試作品回路図>
    PIC16F84をつかった場合の回路図を以下に示します。(→回路図のPDFファイル



  <試作品外観>

  

 



  <プログラム例>

#include <16f84a.h>                // PIC16F84のヘッダーファイル読込み
#use delay(clock=10000000)         // 外部発振周波数を10MHzに設定
main()
{
        while(1)
        {
                if(input(PIN_B3) == 0)output_low(PIN_A2);      // RA2ビットへの出力LOW(0V)命令 → LED  点灯
                else output_high(PIN_A2);                      // RA2ポートへの出力High(5V)命令 → LED 消灯
        }
        return 0;                      // int main()なので 戻り値がないとコンパイラの警告がでる
}

 (2) C18編
   C18コンパイラの例を以下に示します

 <試作品回路図>(→回路図のPDFファイル
    PIC18F4550をつかった場合の回路図を以下に示します。


<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています


  <プログラム例>
/*
 
オルタネートSWによる
                LED ON/OFF
*/


#include <p18f4550.h>


#pragma config PLLDIV = 5       //96MHz PLL Prescalar(1、2、3、4、5、6、10、12のみ) : 外部周波数÷4MHz
                                                        //20MHz ÷ 5 = 4MHz → 96MHz(=4MHz×24 :固定)
#pragma config USBDIV = 2       // Full Speed USB Clock Source Selection : 2(constant)
#pragma config CPUDIV = OSC1_PLL2       //CPU System Clock Postscaler 
                                                                        // PICのUSB制御用クロック周波数:48MHz(=96MHz ÷2)
#pragma config FOSC = HS // システムクロック=20MHz 
//#pragma config FOSC = HSPLL_HS        // システムクロック=48MHz

#pragma config WDT = OFF        //ウォッチドックタイマ OFF
#pragma config LVP = OFF        //Low Voltage Program  OFF


void main (void)
{
        TRISB = 0x00;// B portを出力モードに設定
        TRISC = 0b00000010;// C portのRC1を入力モードに設定

  while (1)                     //入力信号をチェックし続ける
    {
                if(PORTCbits.RC1 == 0)LATBbits.LATB2 = 0;       // CポートのRCビットが0なら BポートのRB2ビットを0にする → LED点灯
                else    LATBbits.LATB2 = 1;     //LED消灯
    }
}

 (2)a  XC8編

XC8コンパイラによる PIC18 の例を以下に示します

 <試作品回路図>(→回路図のPDFファイル







          

<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています




   <プログラム例>
#include <p18f14K50.h>
#include <xc.h>

long int Clock = 48; //12MHz x 4(PLL) = 48MHz
long Count_delay;

#define _XTAL_FREQ 48000000

#pragma config CPUDIV = NOCLKDIV ,USBDIV = OFF,PCLKEN = ON
#pragma config FOSC = HS,PLLEN = ON, HFOFST = OFF           //PLL ON  Periferal= 12MHz x 4 = 48MHz
#pragma config PWRTEN = ON, BOREN = OFF, MCLRE = OFF, BORV = 30
#pragma config WDTEN = OFF,LVP = OFF,FCMEN = OFF, IESO = OFF
#pragma config CP0 = OFF,XINST = OFF
#pragma config STVREN = OFF, BBSIZ = OFF,CPB = OFF,CP1 = OFF,CPD = OFF  //省略するとwarnig がでる
#pragma config WRT0 = OFF,WRT1 = OFF,WRTC = OFF,WRTB = OFF,EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF //省略するとwarnig がでる




int main()
{
    ANSEL = 0x00;                                       // デジタルに設定
    TRISC = 0b00100000; //RC5: in

    LATCbits.LATC0 = 0;         //Led RC0 : OFF
    LATCbits.LATC1 = 0;
    LATCbits.LATC2 = 0;
    LATCbits.LATC3 = 0;

    while(1)
    {
        if(PORTCbits.RC5 == 0)  //SW ONの場合
        {
            LATCbits.LATC0 = 1;    //Led RC0 : ON
            LATCbits.LATC1 = 1;
            LATCbits.LATC2 = 1;
            LATCbits.LATC3 = 1;
        }
        else
        {
            LATCbits.LATC0 = 0;    //Led RC0 : OFF
            LATCbits.LATC1 = 0;
            LATCbits.LATC2 = 0;
            LATCbits.LATC3 = 0;
        }
    }
    return 0;
}

 





 (3) C30  dsPIC編
   C30コンパイラによる dsPIC の例を以下に示します

 <試作品回路図>(→回路図のPDFファイル
    dsPIC30F2012をつかった場合の回路図を以下に示します。




<試作品外観>PICへの書き込みはICSPでおこなっています。ICSP用のコネクタは写真には写っていません。




  <プログラム例>

///************************************************************/
// LEDの オルタネートスチッチによるON/OFF 
//************************************************************/

#include        "p30f2012.h"

#define Clock   117920000       // 単位はHzで指定

_FOSC(CSW_FSCM_OFF &            // クロック切り替えなし、フェースセイフクロックモニタなし
                FRC_PLL16       //内臓高速RC発振器(7.37MHz)、PLL:16倍 → システムクロック周波数=7.37×16=117.92MHz
                );
_FWDT(WDT_OFF); 

_FBORPOR(PBOR_ON &              //ブラウンアウトリセット機能:ON
                BORV_42 &       //ブラウンアウト電圧:4.2V
                PWRT_64 &       //パワーオンリセットタイマ64msec
                 MCLR_EN        //MCLR機能:ON
                );
_FGS(CODE_PROT_OFF);            //コードプロテクト:OFF


/// メイン関数
int     main(void)
{

        TRISC = 0X0000;         //Cポートを出力モードに設定
        TRISD = 0xFFFF;         //Dポートを入力モードに設定

        while(1)
        {
                if(PORTDbits.RD8 == 1)LATCbits.LATC13 = 1;      // SW ON(RUN側)の場合
                                                                //    LED2(緑LED)→OFF  LED1(赤LED)→ON
                else LATCbits.LATC13 = 0;                       // SW OFF(LOAD側)の場合
                                                                //    LED2(緑LED)→ON  LED1(赤LED)→ OFF                                                                                            
        }
        return 0;
}

(4) C30   PIC24編
  C30コンパイラ PIC24FJ64GA002の例を紹介します。

<試作品回路図>(→回路図のPDFファイル

<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています



   <プログラム例>

///************************************************************/
// LEDの オルタネートスチッチによるON/OFF 
//************************************************************/
#include        "p24FJ64GA002.h"

#define Clock   32000000        // 単位はHzで指定

/// コンフィギュレーション ビットの設定
_CONFIG1( JTAGEN_OFF &  //JTAGポート: OFF
                         GCP_OFF &      //コードプロテクト: OFF
                        GWRP_OFF &      //書き込みプロテクト: OFF
                        BKBUG_OFF &     //バックグランドデバック: OFF
                        COE_OFF &       //クリップオン エミュレーション: OFF 
                        ICS_PGx1&       //ICDピンの選択: EMUC/EMUDをPGC1/PGD1と共用
                        FWDTEN_OFF )//ウォッチドックタイマ: OFF 


_CONFIG2( IESO_OFF &    // 2速度スタートアップ機能:OFF
                FNOSC_FRCPLL &  //内臓高速RC発振(8MHZ)回路 + 4倍PLL → 32MHz(= 8MHz × 4)
                FCKSM_CSDCMD &  //クロック切替え制御:OFF クロックモニタ:OFF
                OSCIOFNC_OFF &  //OSCO/RC15 function: OSCO or Fosc/2
                IOL1WAY_OFF &   //RP Register Protection: Unlimited Writes To RP Registers
                I2C1SEL_PRI &   //I2C1 pins Select: Use Primary I2C1 pins
                POSCMOD_NONE)   //発振回路モード Oscillator Selection:  Primary disabled


/// メイン関数
int     main(void)
{

                AD1PCFG = 0xFFFF;       //AD1PCFGレジスタ: Aポートをアナログで使用するかデジタルで使用するかの設定レジスタ
                                                        //全ポートデジタルポートに指定(デフォルトはアナログ故デジタルで使用するときは必須)             
                TRISA = 0xFFFF;         //Aポートを入力モードに設定

        TRISB = 0x0000;         //Bポートを出力モードに設定
      
        while(1)
        {
                if(PORTAbits.RA0 == 1)LATBbits.LATB15 = 1;      // AポートのRA0がOFFなら BポートのRB15 OFF:
                                                                                                                                // LED → OFF    
                                                               
                else LATBbits.LATB15 = 0;                       //  LED → ON     
                                                                                                                                                 
        }
        return 0;
}



(5) PIC32MX編  
  PIC32MX460F512  C32コンパイラの場合の例を紹介します。

<試作品回路図>(→回路図のPDFファイル


<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています



   <プログラム例>


// PIC32MX460F512L    SWによる  LED ON/OFF 
//                
#include <proc/p32mx460f512l.h>         //PIC32MX460F512L
#include <plib.h>               // PIC32 peripheral library 
                                                        //for SYSTEMConfigPerformance()

// コンフィギュレーション設定
// CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off
#pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2
#pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1
#pragma config FWDTEN=OFF, ICESEL=ICS_PGx2

int Clock = 80000000;   //80MHz


int main(void)
{
        SYSTEMConfigPerformance(80000000);      // システム最適化

        DDPCONbits.JTAGEN = 0;  //I/OポートとしてRA0、RA1、RA4、RA5をつかう場合、電源投入後DDPCONレジスタのbit3を0に、設定する必要があり;ます。
                //From the data sheet
                //"JTAG program/debug port is multiplexed with port pins RA0, RA1, RA4 and RA5 on 100-pin devices.
                // At power-on-reset, these pins are controlled by the JTAG port. To use these pins for general purpose I/O,
                // the user’s application code must clear JTAGEN (DDPCON<3>) bit = 0. To use these pins for JTAG program/debug,
                // the user’s application code must maintain JTAGEN bit = 1." 




                        
        TRISAbits.TRISA4 = 0;   //Aポートbit4を出力モードに設定
        TRISAbits.TRISA5 = 0;
        TRISAbits.TRISA6 = 0;
        TRISAbits.TRISA7 = 0;
        
        TRISEbits.TRISE8 = 1;//Eポートbit8を入力モードに設定
      
 

        while(1)
        {
                if(PORTEbits.RE8 == 0)  //SW1=ON
                {
                        LATAbits.LATA4 = 1;     // RA4 LED点灯
                        LATAbits.LATA5 = 1;
                        LATAbits.LATA6 = 1;
                        LATAbits.LATA7 = 1;
                }
                else                                    //SW1=OFF
                {
                        LATAbits.LATA4 = 0;     // RA4 LED消灯
                        LATAbits.LATA5 = 0;
                        LATAbits.LATA6 = 0;
                        LATAbits.LATA7 = 0;
                }



        }
}

(6) HI-TECH 編

PIC16F1937の例を紹介します。

試作品回路図(→PDFファイル





<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています



          

   <プログラム例>

//HI-TEC LED  SW ON_OFF
//Delay style    Time 2sec: On Time 1sec,Off Time 1sec
//                                                PIC16F1937

#include  <htc.h>

#define _XTAL_FREQ 20000000             //Ceramic :20MHz     

//Configuration
__CONFIG(
                FOSC_HS &                       // EXTRC Oscillator, RC on RA7/OSC1/CLKIN
                WDTE_OFF &              // Power-up Timer Enable bit// PWRT disabled
                PWRTE_ON &              // MCLR Pin Function Select// RE3/MCLR/VPP pin function is MCLR
                MCLRE_ON &              // RE3/MCLR/VPP pin function is digital input
                CP_OFF  &               // Program memory code protection is enabled
                CPD_OFF &               // Data memory code protection is enabled
                BOREN_OFF &             // Clock Out Enable bit// CLKOUT function is disabled. I/O or oscillator function on RA6/CLKOUT
                CLKOUTEN_OFF &  // CLKOUT function is enabled on RA6/CLKOUT pin
                IESO_OFF &              // Fail Clock Monitor Enable// Fail-Safe Clock Monitor is enabled
                FCMEN_ON                // Fail-Safe Clock Monitor is disabled
                );


__CONFIG(
                WRT_OFF &       // 000h to 1FFh write protected, 200h to 1FFFh may be modified by EECON control
                PLLEN_OFF &     // 4x PLL disabled
                STVREN_OFF &// Brown-out Reset Voltage selection// Brown-out Reset Voltage (VBOR) set to 1.9 V
                BORV_19 &       // Brown-out Reset Voltage (VBOR) set to 2.7 V
//              DEBUG_OFF &     // Background debugger is enabled
                LVP_OFF         // HV on MCLR/VPP must not be used for programming
                );



void main()
{
        TRISD = 0;      //D port: outport
        TRISC = 0xFF;           // C port inport

        while(1)
        {
                if(RC0 == 0)    //SW : off
//              if(PORTCbits.RC0 == 0)  // これもOK
                {
                        LATD0 = 1;                      //RD0 port LED off
                        LATD1 = 1;                      //RD1 port LED off
                        LATD2 = 1;                      //RD2 port LED off
                        LATD7 = 1;                      //RD7 port LED off
                }
                else            // SW : on
                {
                        LATD0 = 0;                      //RD0 port LED on
                        LATD1 = 0;                      //RD1 port LED on
                        LATD2 = 0;                      //RD2 port LED on
                        LATD7 = 0;                      //RD7 port LED on
                }
        }


}